<?php
/**
 * Service_Translate
 *
 * Класс Service_Translate осуществляет работу с переводами
 *
 * @author Дмитий Кузьма <kouzma.d@gmail.com>
 * @version 2.0
 */
class Service_Translate {
	
	private static $_lang = 'ru';
	private static $_langUrl = 'rus';
	private static $_arrWords = null;
	private static $_tempLang = 'ru';
	private static $_arrLanguages = array('ru', 'en'); // Доступные в системе языки
	
	/**
	 * Устанавливает язык 
	 * 
	 * @param string $lang - язык
	 */
	public static function setLang($lang) {
		$lang = substr($lang, 0, 2);
		self::$_tempLang = self::$_lang;
		switch ($lang) {
			case 'en': 
				self::$_lang = $lang;
				self::$_langUrl = 'eng';
				break;
			case 'ru': 
				self::$_lang = $lang;
				self::$_langUrl = 'rus'; 
				break;
			default: 
				self::$_lang = 'ru';
				self::$_langUrl = 'rus';
  	}
  	self::$_arrWords = null;
	}
	
	/**
	 * Устанавливает язык который был раньше
	 */
	public static function setPreviousLang() {
		self::setLang(self::$_tempLang);
	}
	
	/**
	 * Возвращает текущее значение языка
	 * 
	 */
	public static function getLang() {
		return self::$_lang;
	}
	
	/**
	 * Возвращает текущее значение языка для url
	 * 
	 */
	public static function getLangForUrl() {
		return self::$_langUrl;
	}
	
  /**
   * Возвращает перевод нужной фразы для текущего языка
   * 
   * @param string $value
   */
	public static function getText($value) {
	if (!self::$_arrWords) {
  	  switch (self::$_lang) {
			  case 'en': self::$_arrWords = Language_En::$arrWords; break;
			  case 'ru': self::$_arrWords = Language_Ru::$arrWords; break;
  	  }
  	}
  	
  	if (isset(self::$_arrWords[$value])) { // Если есть перевод
	  	$args = func_get_args();
			if (sizeof($args) > 1) {
				if ( is_array($args[1]) ) $args = array_merge(array($args[0]), $args[1]);
				$retString = self::$_arrWords[$value];
				$argsSize = sizeof($args);
				for ($i = 1; $i < $argsSize; $i++) { // Если есть доп. аргументы, то делаем на их основе автозамену
					$retString = preg_replace("/%s" . ($argsSize - $i) . "/", $args[$argsSize - $i], $retString);
				}
				/*
				foreach ($args as $i => $arg) { // Если есть доп. аргументы, то делаем на их основе автозамену
					if ($i) {
					  $retString = preg_replace("/%s" . $i . "/", $arg, $retString);
					}
				}
				*/
				return $retString;
			}
  		return self::$_arrWords[$value];
  	}
  	else {

  		if (defined('MAIL_CLASS_DEFINED') && User_User::getId() == 1 && !strpos($_SERVER['REQUEST_URI'], '/ajax/') && !defined('IS_API_REQUEST')) {
	  		static $terminationFunctionRegistered = false;
	  		static $missedTranslations = array();
	  		
	  		if(!$terminationFunctionRegistered) {
	  			
	  			register_shutdown_function(function() use (&$missedTranslations) {	
  					echo '<script>' . PHP_EOL;
  					foreach($missedTranslations as $string) {
  						echo 'console.warn(\'[PHP][' . Service_Translate::getLang() . '] No translation for: \' + String(' . json_encode($string[0]) . ') + ' . json_encode(' -> ' . $string[1]) . ');' . PHP_EOL;
  					}
  					echo '</script>' . PHP_EOL;
	  			});
	  			
	  			$terminationFunctionRegistered = true;
	  		}
	  		
	  		$backtrace = debug_backtrace();
	  		$missedTranslations []= array($value, $backtrace[0]['file'] . ':' . $backtrace[0]['line']);
  		}
  		
  		return $value;
  	}
  }
  
  /**
   * Определяет язык ввода по строке, набранной пользователем
   * 
   * @param String $string
   */
  public static function getLangByString($string) {
    	$code = Service_Function::uniord($string);
  	if ($code >= 65 && $code <= 90 || $code >= 97 && $code <= 122) return 'en';
  	if ($code >= 1040 && $code <= 1105) return 'ru';
  	return false;	  
  }
  
  /**
   * Проверяем ялвяется ли текст английским
   *  
   * @param string $text - Текст для прверки 
   */
  public static function isEnLanguage($text) {
  	if (!preg_match('#[A-z]{2,15}\s[A-z]{2,15}#is', $text)) return false;
  	mb_regex_encoding('UTF-8');
  	mb_internal_encoding("UTF-8");
  	$stop = mb_strlen($text); 
		$arrSymbols = array(); 
		for($idx = 0; $idx < $stop; $idx++) { 
			$arrSymbols[] = mb_substr($text, $idx, 1); 
		} 
  	$arrDiac = Service_Generate::$arrDiac;
  	for ($i = 65; $i <= 90; $i++) unset($arrDiac[chr($i)]);
  	for ($i = 97; $i <= 122; $i++) unset($arrDiac[chr($i)]);
  	$arrDiac = array_keys($arrDiac);
  	foreach ($arrSymbols as $symbol) {
  		if (in_array($symbol, $arrDiac)) return false;
  	}
  	return true;  	
  }
  
  /**
   * Метод проверяет наличие стоп-слов в тексте
   * @param string $text - текст для проверки
   */
  public static function checkOnStopWord($text) {
  	$arrStopWords = array('ist', 'der', 'zu', 'vor', 'und', 'das', 'von', 'zur', 'um', 'des', 'ich', 'den', 'es', 'auf', 'viel', 'im', 'een', 'ad', 'ma');
  	
  	foreach ($arrStopWords as $stopWord) if (strpos($text, ' ' . $stopWord . ' ')) return true;
  	
  	return false;
  }
  
  /**
   * Возвращаем доступные в системе языки
   *   
   * @return array - Доступные языки
   */
 	public static function getAvailableLanguages() {
 		return self::$_arrLanguages;
 	}
  
  /**
   * Возвращаем доступные в системе языки
   *   
   * @return array - Доступные языки
   */
 	public static function getLangForUrlByLang($lang) {
 		switch ($lang) {
 			case 'ru': return 'rus';
 			case 'en': return 'eng';
 		}
 	}
 	
 	/**
 	 * Определяем язык с помощью сервива google translate
 	 * @param string $text - текст, язык которого надо определить
 	 */
 	public static function getLangTextFromGoogleTranslate($text) {
 		$text = Service_Function::utf8_string_with_limit($text, 70); // Уменьшаем длину текста, т.к. нельзя передавать слишком длинный текст
 		
 		$objCurl = new Service_Curl();
 		$result = $objCurl->httpRequest('GET', 'http://translate.google.ru/translate_a/t?client=x&text=' . str_replace(' ', '+', $text) . '&sl=auto&tl=ru');
 		$objTranslate = json_decode($result);
 		
 		return (string)$objTranslate->src;
 	}
 	

}
?>